home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / hamradio / tnos-2.000 / tnos-2 / stats.c < prev    next >
C/C++ Source or Header  |  1996-06-23  |  11KB  |  579 lines

  1. #include "global.h"
  2. #ifdef STATS
  3. #include "stats.h"
  4.  
  5.  
  6. #if !defined(_lint) && !defined(MSDOS)
  7. static char rcsid[] OPTIONAL = "$Id: stats.c,v 1.7 1996/06/24 02:54:26 root Exp root $";
  8. #endif
  9.  
  10. void statsdaemon __ARGS((int i,void *v1,void *v2));
  11. static void updatestats __ARGS((void));
  12. static void newhour __ARGS((int hour));
  13. static void newday __ARGS((int hour));
  14. static void endmonthclear __ARGS((int hour, int month));
  15. static void endday __ARGS((int hour));
  16. static void eachcycle __ARGS((time_t now));
  17.  
  18.  
  19. time_t statslast;
  20.  
  21.  
  22. const char DFAR dailyhdr[] = "\n%s per hour in the last 24 hours (excluding current hour)\n\n";
  23. const char DFAR weeklyhdr[] = "\n%s per day in the last 7 days (excluding current day)\n\n";
  24. const char DFAR monthlyhdr[] = "\n%s per day in the last month (excluding current day)\n\n";
  25. const char DFAR yearlyhdr[] = "\n%s per month in the last year (excluding current month)\n\n";
  26.  
  27. const char DFAR STAT_emptystr[] = "";
  28. const char DFAR STAT_dailytrailer[] = 
  29.     "------------------------           ------------------------\n"
  30.     "0 0 0 0 0 1 1 1 1 1 2 2  Hour      0 0 0 0 0 1 1 1 1 1 2 2  Hour\n"
  31.     "0 2 4 6 8 0 2 4 6 8 0 2            0 2 4 6 8 0 2 4 6 8 0 2\n\n";
  32. const char DFAR STAT_weeklytrailer[] = 
  33.     "---------------------------------       ---------------------------------\n"
  34.     "SUN  MON  TUE  WED  THU  FRI  SAT       SUN  MON  TUE  WED  THU  FRI  SAT\n\n";
  35. const char DFAR STAT_monthlytrailer[] = 
  36.     "-------------------------------           -------------------------------\n"
  37.     " 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3  Days       0 0 0 0 1 1 1 1 1 2 2 2 2 2 3  Days\n"
  38.     " 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0             2 4 6 8 0 2 4 6 8 0 2 4 6 8 0\n\n";
  39. const char DFAR STAT_yearlytrailer[] = 
  40.     "------------           ------------\n"
  41.     " 0 0 0 0 1 1  Month     0 0 0 0 1 1  Month\n"
  42.     " 2 4 6 8 0 2            2 4 6 8 0 2\n\n";
  43. const char DFAR STAT_cannotclear[] = "Sorry, stats can only be cleared from the console\n";
  44.  
  45.  
  46.  
  47. static struct cmds DFAR STATScmds[] = {
  48. #ifdef STATS_AREA
  49.     { "area",    doSTATarea,    0,    0,    NULLCHAR },
  50. #endif
  51.     { "clear",    doSTATclear,    0,    0,    NULLCHAR },
  52. #ifdef STATS_FWD
  53.     { "forwarding",    doSTATforward,    0,    0,    NULLCHAR },
  54. #endif
  55.     { "load",    doSTATload,    0,     0,    NULLCHAR },
  56. #ifdef STATS_MSG
  57.     { "messages",    doSTATmessage,    0,    0,    NULLCHAR },
  58. #endif
  59.     { "save",    doSTATsave,    0,     0,    NULLCHAR },
  60. #ifdef STATS_TFC
  61.     { "traffic",    doSTATtraffic,    0,    0,    NULLCHAR },
  62. #endif
  63. #ifdef STATS_USE
  64.     { "usage",    doSTATusage,    0,    0,    NULLCHAR },
  65. #endif
  66.     { NULLCHAR,    NULL,        0,    0,    NULLCHAR }
  67. };
  68.  
  69.  
  70. int
  71. dostats(argc,argv,p)
  72. int argc;
  73. char *argv[];
  74. void *p;
  75. {
  76.     return subcmd(STATScmds,argc,argv,p);
  77. }
  78.  
  79.  
  80. int
  81. doSTATclear(argc,argv,p)
  82. int argc;
  83. char *argv[];
  84. void *p;
  85. {
  86. int c;
  87. struct mbuf *bp;
  88. int done = 0;
  89.  
  90.     if(Curproc->input != Command->input)
  91.         tputs (STAT_cannotclear);
  92.     else    {
  93.         if (argc == 2)
  94.             c = argv[1][0];
  95.         else    {
  96.             tputs ("\007Clear all statistics: Are you sure? ");
  97.             tflush ();
  98.             (void) recv_mbuf(Command->input,&bp,0,NULLCHAR,0);
  99.             c = bp->data[0];
  100.         }
  101.  
  102.         if(c == 'y' || c == 'Y')    {
  103.             done = 1;
  104. #ifdef STATS_AREA
  105.             (void) doSTATclear_area(argc, argv, p);
  106. #endif
  107. #ifdef STATS_USE
  108.             (void) doSTATclear_use(argc, argv, p);
  109. #endif
  110. #ifdef STATS_FWD
  111.             (void) doSTATclear_fwd(argc, argv, p);
  112. #endif
  113. #ifdef STATS_MSG
  114.             (void) doSTATclear_msg(argc, argv, p);
  115. #endif
  116. #ifdef STATS_TFC
  117.             (void) doSTATclear_tfc(argc, argv, p);
  118.         }
  119. #endif
  120.     }
  121.     tprintf ("Statistics %scleared....\n", (done) ? "" : "not ");
  122.     return 0;
  123. }
  124.  
  125.  
  126. int
  127. doSTATsave(argc,argv,p)
  128. int argc OPTIONAL;
  129. char *argv[] OPTIONAL;
  130. void *p OPTIONAL;
  131. {
  132. FILE *fp;
  133. char buffer[256];
  134.  
  135.     sprintf (buffer, "%s/last", STATSDir);
  136.     fp = fopen (buffer, "w");
  137.     if (fp != NULLFILE)    {
  138.         fprintf (fp, "Last: %ld\n", statslast);
  139.         fclose (fp);
  140.     } else
  141.         log (-1, "Can't open stats file '%s/last'", STATSDir);
  142.  
  143. #ifdef STATS_AREA
  144.     savestats_area();
  145. #endif
  146. #ifdef STATS_USE
  147.     savestats_use();
  148. #endif
  149. #ifdef STATS_FWD
  150.     savestats_fwd();
  151. #endif
  152. #ifdef STATS_MSG
  153.     savestats_msg();
  154. #endif
  155. #ifdef STATS_TFC
  156.     savestats_tfc();
  157. #endif
  158.     return 0;
  159. }
  160.  
  161. int
  162. doSTATload(argc,argv,p)
  163. int argc OPTIONAL;
  164. char *argv[] OPTIONAL;
  165. void *p OPTIONAL;
  166. {
  167.     loadstats ("last", &statslast, &statslast);
  168.     pwait (NULL);
  169. #ifdef STATS_USE
  170.     loadstats_use();
  171. #endif
  172. #ifdef STATS_MSG
  173.     loadstats_msg();
  174. #endif
  175. #ifdef STATS_TFC
  176.     loadstats_tfc();
  177. #endif
  178. #ifdef STATS_AREA
  179.     loadstats_area();
  180. #endif
  181. #ifdef STATS_FWD
  182.     loadstats_fwd();
  183. #endif
  184.     return 0;
  185. }
  186.  
  187.  
  188. void
  189. saveastat (fp, num, data, str)
  190. FILE *fp;
  191. int num;
  192. long *data;
  193. const char *str;
  194. {
  195. int k;
  196.  
  197.     for (k = 0; k < num; k++)    {
  198.         fprintf (fp, "%s[%d]: %ld", str, k, *data++);
  199.         fprintf (fp, " %ld\n", *data++);
  200.     }
  201.  
  202. }
  203.  
  204.  
  205. void
  206. finishSavingStat (fp, data)
  207. FILE *fp;
  208. long *data;
  209. {
  210.     fprintf (fp, "Start: %ld\n", data[0]);
  211.     fprintf (fp, "Last: %ld\n", data[1]);
  212.     fclose (fp);
  213. }
  214.  
  215.  
  216. #if defined(STATS_USE) || defined(STATS_MSG) || defined(STATS_TFC)
  217. void
  218. loadstats(name, beginning, ending)
  219. const char *name;
  220. void *beginning, *ending;
  221. {
  222. char buffer[256], *cp;
  223. long *lp;
  224. FILE *fp;
  225.  
  226.     lp = (long *)beginning;
  227.     sprintf (buffer, "%s/%s", STATSDir, name);
  228.     fp = fopen (buffer, "r");
  229.     if (fp != NULLFILE)    {
  230.         while (!feof(fp))    {
  231.             pwait (NULL);
  232.             (void) fgets (buffer, 79, fp);
  233.             if (feof(fp))
  234.                 continue;
  235.             rip (buffer);
  236.             cp = strchr (buffer, ' ');
  237.             if (!cp)    {
  238.                 log (-1, "Error in loading stats file '%s/%s'", STATSDir, name);
  239.                 fclose (fp);
  240.                 return;
  241.             }
  242.             *lp++ = atol (++cp);
  243.             if (lp > (long *)ending)
  244.                 break;
  245.             cp = strchr (cp, ' ');
  246.             if (cp)    {
  247.                 *lp++ = atol (++cp);
  248.                 if (lp > (long *)ending)
  249.                     break;
  250.             }
  251.         }
  252.         fclose (fp);
  253.     } else
  254.         log (-1, "Can't open stats file '%s/%s'", STATSDir, name);
  255.     pwait (NULL);
  256. }
  257. #endif
  258.  
  259.  
  260.  
  261. #if defined(STATS_USE) || defined(STATS_MSG) || defined(STATS_AREA) || defined(STATS_FWD) || defined(STATS_TFC)
  262. void
  263. doGraph (num, array)
  264. int num;
  265. long array[][2];
  266. {
  267. long chart[31][2], highest[2], divisor[2];
  268. int k, l, m;
  269. int multiplyit[2];
  270.  
  271.     highest[0] = highest[1] = 0L;
  272.     divisor[0] = divisor[1] = 1L;
  273.     multiplyit[0] = multiplyit[1] = 0;
  274.     for (k = 0; k < num; k++)
  275.         chart[k][0] = chart[k][1] = 0L;
  276.     for (k = 0; k < num; k++)
  277.         for (l = 0; l < 2; l++)
  278.             if (array[k][l] > highest[l])
  279.                 highest[l] = array[k][l];
  280.  
  281.     for (k = 0; k < 2; k++)    {
  282.         if ((highest[k] < 10L) && highest[k])    {
  283.             multiplyit[k] = 1;
  284.             divisor[k] = (10 / highest[k]);
  285. #if 0
  286.             if (divisor[k] < 2)
  287.                 divisor[k] = 2;
  288. #endif
  289.         } else     if (highest[k] >= 10L)
  290.             divisor[k] = highest[k] / 10L;
  291.     }
  292.  
  293.     for (k = 0; k < num; k++)
  294.         for (l = 0; l < 2; l++)        {
  295.             if (multiplyit[l])
  296.                 chart[k][l] = array[k][l] * divisor[l];
  297.             else    {
  298.                 chart[k][l] = array[k][l] / divisor[l];
  299.                 if (array[k][l] % divisor[l])
  300.                     chart[k][l]++;
  301.             }
  302.             if (chart[k][l] > 10L)
  303.                 chart[k][l] = 10L;
  304.         }
  305.     for (m = 10; m ; m--)    {    /* each line */
  306.         for (l = 0; l < 2; l ++)    {
  307.             for (k = 0; k < num; k++)    {
  308.                 if (chart[k][l] >= m)    {    /*lint !e771 */
  309.                     if (num != 7)
  310.                         tputc ('*');
  311.                     else
  312.                         tputs ("***");
  313.                 } else {
  314.                     if (num != 7)
  315.                         tputc (' ');
  316.                     else
  317.                         tputs ("   ");
  318.                 }
  319.                 if (num == 7)
  320.                     tputs ("  ");
  321.             }
  322.             if (!l)    {
  323.                 if (num != 7)
  324.                     tputs ("           ");
  325.                 else
  326.                     tputs ("     ");
  327.             } else
  328.                 tputc('\n');
  329.         }
  330.     }
  331. }
  332. #endif
  333.  
  334.  
  335. static void
  336. updatestats(void)
  337. {
  338. #ifdef STATS_AREA
  339.     updatestats_area ();
  340. #endif
  341. #ifdef STATS_USE
  342.     updatestats_use ();
  343. #endif
  344. #ifdef STATS_FWD
  345.     updatestats_fwd ();
  346. #endif
  347. #ifdef STATS_MSG
  348.     updatestats_msg ();
  349. #endif
  350. #ifdef STATS_TFC
  351.     updatestats_tfc ();
  352. #endif
  353. }
  354.  
  355.  
  356. static void
  357. newhour (int hour)
  358. {
  359. #ifdef STATS_AREA
  360.     newhour_area(hour);
  361. #endif
  362. #ifdef STATS_USE
  363.     newhour_use(hour);
  364. #endif
  365. #ifdef STATS_FWD
  366.     newhour_fwd(hour);
  367. #endif
  368. #ifdef STATS_MSG
  369.     newhour_msg(hour);
  370. #endif
  371. #ifdef STATS_TFC
  372.     newhour_tfc(hour);
  373. #endif
  374. }
  375.  
  376.  
  377. static void
  378. newday (int day)
  379. {
  380. #ifdef STATS_AREA
  381.     newday_area (day);
  382. #endif
  383. #ifdef STATS_USE
  384.     newday_use (day);
  385. #endif
  386. #ifdef STATS_FWD
  387.     newday_fwd (day);
  388. #endif
  389. #ifdef STATS_MSG
  390.     newday_msg (day);
  391. #endif
  392. #ifdef STATS_TFC
  393.     newday_tfc (day);
  394. #endif
  395. }
  396.  
  397.  
  398. static void
  399. endmonthclear (int day, int month)
  400. {
  401. #ifdef STATS_AREA
  402.     endmonthclear_area (day, month);
  403. #endif
  404. #ifdef STATS_USE
  405.     endmonthclear_use (day, month);
  406. #endif
  407. #ifdef STATS_FWD
  408.     endmonthclear_fwd (day, month);
  409. #endif
  410. #ifdef STATS_MSG
  411.     endmonthclear_msg (day, month);
  412. #endif
  413. #ifdef STATS_TFC
  414.     endmonthclear_tfc (day, month);
  415. #endif
  416. }
  417.  
  418.  
  419. static void
  420. endday (int day)
  421. {
  422. #ifdef STATS_AREA
  423.     endday_area (day);
  424. #endif
  425. #ifdef STATS_USE
  426.     endday_use (day);
  427. #endif
  428. #ifdef STATS_FWD
  429.     endday_fwd (day);
  430. #endif
  431. #ifdef STATS_MSG
  432.     endday_msg (day);
  433. #endif
  434. #ifdef STATS_TFC
  435.     endday_tfc (day);
  436. #endif
  437. }
  438.  
  439.  
  440. static void
  441. eachcycle (time_t now)
  442. {
  443.     statslast = now;
  444. #ifdef STATS_AREA
  445.     eachcycle_area (now);
  446. #endif
  447. #ifdef STATS_USE
  448.     eachcycle_use (now);
  449. #endif
  450. #ifdef STATS_FWD
  451.     eachcycle_fwd (now);
  452. #endif
  453. #ifdef STATS_MSG
  454.     eachcycle_msg (now);
  455. #endif
  456. #ifdef STATS_TFC
  457.     eachcycle_tfc (now);
  458. #endif
  459. }
  460.  
  461.  
  462. static void
  463. init (time_t now)
  464. {
  465.     statslast = 0;
  466. #ifdef STATS_AREA
  467.     init_area (now);
  468. #endif
  469. #ifdef STATS_USE
  470.     init_use (now);
  471. #endif
  472. #ifdef STATS_FWD
  473.     init_fwd (now);
  474. #endif
  475. #ifdef STATS_MSG
  476.     init_msg (now);
  477. #endif
  478. #ifdef STATS_TFC
  479.     init_tfc (now);
  480. #endif
  481. }
  482.  
  483.  
  484. void
  485. statsdaemon (i,v1,v2)
  486. int i OPTIONAL;        /* Args not used */
  487. void *v1 OPTIONAL;
  488. void *v2 OPTIONAL;
  489. {
  490. time_t now, then;
  491. struct tm *t;
  492. int lastmin = -1, hour, day;
  493.  
  494.     then = now = time((time_t *)0);
  495.     init(now);
  496.     (void) doSTATload(0, (char **)0, (void *)0);
  497.     t = localtime(&now);
  498.     t->tm_min = 0;
  499.     then = mktime (t);
  500.  
  501.     /* adjust in case previously not shut down properly */
  502.     if (statslast && statslast < then)    {
  503.         /* adjust for missing hour */
  504.         hour = t->tm_hour - 1;
  505.         if (hour < 0)
  506.             hour = 23;
  507.         newhour (hour);
  508.         t->tm_hour = 0;
  509.         then = mktime (t);
  510.  
  511.         if (statslast < then)    {
  512.             /* adjust for missing day */
  513.             day = t->tm_wday - 1;
  514.             if (day < 0)
  515.                 day = 6;
  516.             newday (day);
  517.             day = t->tm_mday - 2;
  518.  
  519.             if (day < 0)    {    /* new month begins */
  520.                 /* let the OS tell us the # of days in last month */
  521.                 t->tm_mday = 1;
  522.                 t->tm_hour = 0;
  523.                 t->tm_sec = 0;
  524.                 then = mktime (t);
  525.                 then -= 3600;
  526.                 t = localtime (&then);
  527.                 day = t->tm_mday - 1;
  528.  
  529.                 endmonthclear (day + 1, t->tm_mon);
  530.             }
  531.             endday (day);
  532.         }
  533.     }
  534.  
  535.     for(;;){
  536.         (void) mspause(6000L);    /* Run stats 10 times a minute, every 6 seconds */
  537.         updatestats();
  538.         now = time((time_t *)0);
  539.         t = localtime(&now);
  540.         if ((!t->tm_min && lastmin != t->tm_min) || (lastmin != -1 && lastmin > t->tm_min))    {
  541.             /* new hour begins */
  542.             hour = t->tm_hour - 1;
  543.             if (hour < 0)
  544.                 hour = 23;
  545.             newhour (hour);
  546.             if (!t->tm_hour)    {    /* new day begins */
  547.                 day = t->tm_wday - 1;
  548.                 if (day < 0)
  549.                     day = 6;
  550.                 newday(day);
  551.                 day = t->tm_mday - 2;
  552.                 if (day < 0)    {    /* new month begins */
  553.                     /* let the OS tell us the # of days in last month */
  554.                     t->tm_mday = 1;
  555.                     t->tm_hour = 0;
  556.                     t->tm_sec = 0;
  557.                     then = mktime (t);
  558.                     then -= 3600;
  559.                     t = localtime (&then);
  560.                     day = t->tm_mday - 1;
  561.  
  562.                     endmonthclear (day + 1, t->tm_mon);
  563.                 }
  564.                 endday (day);
  565.             }
  566.         }
  567.         eachcycle (now);
  568.  
  569.         if (!(t->tm_min % 10) && lastmin != t->tm_min)
  570.             (void) doSTATsave(0, (char **)0, (void *)0);
  571.  
  572.         lastmin = t->tm_min;
  573.     }
  574. }
  575.  
  576.  
  577.  
  578. #endif    /* STATS */
  579.